/*
 * Copyright (C) 2009 Leandro Aparecido <lehphyro@gmail.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.metalframework.jsf.scope;

import java.util.*;

public enum FacesScopeType {

	APPLICATION("application", 0xFF),
	SESSION("session", 0xEE),
	CONVERSATION("conversation", 0xDD),
	PAGE("page", 0xCC),
	REQUEST("request", 0xBB),
	FLASH("flash", 0xAA),
	;
	
	private static final Comparator<FacesScopeType> comparator = new FacesScopeTypeBySizeComparator();
	
	private String name;
	private int size;
	
	private FacesScopeType(String name, int size) {
		this.name = name;
		this.size = size;
	}
	
	public String getName() {
		return name;
	}
	
	public static FacesScopeType identify(String name) {
		for (FacesScopeType type : values()) {
			if (type.getName().equals(name)) {
				return type;
			}
		}
		throw new IllegalArgumentException("Unknown scope name: " + name);
	}
	
	public static FacesScopeType[] getTypesOrderedBySize() {
		List<FacesScopeType> aux = new ArrayList<FacesScopeType>();
		aux.addAll(Arrays.asList(FacesScopeType.values()));
		
		Collections.sort(aux, comparator);
		
		return aux.toArray(new FacesScopeType[0]);
	}

	static class FacesScopeTypeBySizeComparator implements Comparator<FacesScopeType> {
		public int compare(FacesScopeType type1, FacesScopeType type2) {
			return type1.size - type2.size;
		}
	}
	
}
